#!/bin/bash

# 日志输出
LOG_FILE="/var/log/init-mq.log"
exec > >(tee -a "$LOG_FILE") 2>&1
echo "脚本开始运行：$(date)"

# 检查 Java 环境
if ! command -v java &> /dev/null; then
  echo "未检测到 Java 环境，请安装 Java 后再运行此脚本。"
  exit 1
else
  echo "检测到 Java 环境：$(java -version)"
fi

# 设置下载链接和文件名
ROCKETMQ_URL="http://oss.wuyou.run/software/rocketmq/rocketmq-4.9.3.tar.gz"
ROCKETMQ_TAR="rocketmq-4.9.3.tar.gz"

# 检查并下载 RocketMQ 安装包
if [ ! -f "$ROCKETMQ_TAR" ]; then
  echo "$ROCKETMQ_TAR 文件不存在，开始下载..."
  wget "$ROCKETMQ_URL" -O "$ROCKETMQ_TAR"
  if [ $? -eq 0 ]; then
    echo "下载成功。"
  else
    echo "下载失败，请检查网络连接或下载链接是否正确。"
    exit 1
  fi
else
  echo "$ROCKETMQ_TAR 文件已存在，跳过下载。"
fi

# 解压 RocketMQ 安装包
echo "正在解压 $ROCKETMQ_TAR 到 /data/rocketmq..."
mkdir -p /data/rocketmq
tar zxf "$ROCKETMQ_TAR" -C /data/rocketmq --strip-components=1
if [ $? -eq 0 ]; then
  echo "解压成功。"
else
  echo "解压失败，请检查 $ROCKETMQ_TAR 文件是否完整或是否有权限。"
  exit 1
fi

# 获取主机的第一个非回环（非127.0.0.1）IPv4地址
HOST_IP=$(hostname -I | awk '{for(i=1;i<=NF;i++) if ($i !~ /^127\./) {print $i; exit}}')

# 检查是否成功获取到有效的 IP 地址
if [ -z "$HOST_IP" ]; then
  echo "未能获取到有效的主机 IP 地址，请检查网络配置。"
  exit 1
fi

echo "主机 IP 地址是：$HOST_IP"

# 设置 RocketMQ 安装目录
ROCKETMQ_HOME="/data/rocketmq"
CONF_DIR="$ROCKETMQ_HOME/conf/2m-2s-sync"

# 检查 RocketMQ 目录是否存在
if [ ! -d "$ROCKETMQ_HOME" ]; then
  echo "RocketMQ 安装目录不存在：$ROCKETMQ_HOME"
  exit 1
fi

# 创建配置文件目录（如果不存在）
mkdir -p "$CONF_DIR"

# 检查端口是否被占用
check_port() {
  local port=$1
  if netstat -tuln | grep -q ":$port "; then
    echo "端口 $port 已被占用，请检查。"
    exit 1
  fi
}

check_port 9876  # NameServer 端口
check_port 10911 # Broker-0 端口
check_port 10611 # Broker-1 端口

# 备份配置文件
backup_config() {
  local config_file=$1
  if [ -f "$config_file" ]; then
    cp "$config_file" "${config_file}.bak"
    echo "已备份配置文件：${config_file}.bak"
  fi
}

# 定义 Broker 配置
BROKERS=("0:SYNC_MASTER" "1:SLAVE")

# 遍历 Brokers，生成配置文件
for BROKER in "${BROKERS[@]}"; do
  IFS=":" read -r BROKER_ID BROKER_ROLE <<< "$BROKER"
  BROKER_NAME="broker-${BROKER_ID}"
  CONFIG_FILE="$CONF_DIR/${BROKER_NAME}.properties"

  # 备份配置文件
  backup_config "$CONFIG_FILE"

  # 生成配置内容
  cat > "$CONFIG_FILE" <<EOL
brokerClusterName=DefaultCluster
brokerName=broker-0
brokerId=${BROKER_ID}
brokerRole=${BROKER_ROLE}
flushDiskType=ASYNC_FLUSH
brokerIP1=${HOST_IP}
listenPort=10${BROKER_ID}11
storePathRootDir=${ROCKETMQ_HOME}/rocketmqStore/${BROKER_NAME}
namesrvAddr=${HOST_IP}:9876

# 定时与过期策略
deleteWhen=04                       # 每日04点触发过期删除 :contentReference[oaicite:14]{index=14}
fileReservedTime=48                 # 保留文件时长48小时 :contentReference[oaicite:15]{index=15}

# 磁盘水位线触发
diskMaxUsedSpaceRatio=85           # 磁盘使用超85%立即触发清理 :contentReference[oaicite:16]{index=16}
diskFallRecorded=true               # 记录磁盘使用率 :contentReference[oaicite:17]{index=17}

# 清理调度与速率控制
deleteCommitLogFilesInterval=100    # 删除每个commitlog文件后等待100ms :contentReference[oaicite:18]{index=18}
deleteConsumeQueueFilesInterval=100 # 删除每个consumequeue文件后等待100ms :contentReference[oaicite:19]{index=19}
cleanResourceInterval=1000          # 清理线程每1000ms扫描一次 :contentReference[oaicite:20]{index=20}
redeleteHangedFileInterval=120000   # 重试删除锁定文件，间隔120s :contentReference[oaicite:21]{index=21}
EOL

  echo "配置文件已生成：$CONFIG_FILE"
done

echo "脚本运行完成：$(date)"
